package bancosys.tec.exception;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Helper para criação de message creators.
 * 
 * @author lundberg
 */
public final class MessageCreatorHelper {

    private static final Log LOG = LogFactory.getLog(MessageCreatorHelper.class);

    /**
     * Construtor
     */
    private MessageCreatorHelper() {

    }

    /**
     * Cria um message creator delegate para os parâmetros passados.
     * 
     * @param bundle bundle
     * @param key key
     * @param expectedArgumentCount expectedArgumentCount
     * @return message creator
     */
    public static MessageCreator creator(final String bundle, final String key, final int expectedArgumentCount) {
        return new MessageCreator() {
            public int getExpectedArguments() {
                return expectedArgumentCount;
            }

            public LocalizedMessageHolder create(Object... arguments) {
                return MessageCreatorHelper.create(bundle, key, expectedArgumentCount, arguments);
            }

            @Override
            public String toString() {
                return "MessageCreatorHelper:creator: bundle=" + bundle + " key=" + key;
            }
        };
    }

    /**
     * Método utilitário para criação de message holders. Implementações de MessageCreator devem delegar a criação para este método, quando
     * possível.
     * 
     * @param bundle bundle
     * @param key key
     * @param expectedArgumentCount expectedArgumentCount
     * @param arguments arguments
     * @return message holder
     */
    public static LocalizedMessageHolder create(String bundle, String key, int expectedArgumentCount, Object... arguments) {
        sanityCheck(bundle, key, expectedArgumentCount, arguments);
        return new MessageHolder(bundle, key, arguments);
    }

    /**
     * Verifica se os argumentos correspondem ao esperado.
     * 
     * @param bundle bundle
     * @param key key
     * @param expectedArgumentCount expectedArgumentCount
     * @param arguments arguments
     */
    private static void sanityCheck(String bundle, String key, int expectedArgumentCount, Object... arguments) {
        if (arguments.length != expectedArgumentCount) {
            LOG.warn("Número de argumentos incorreto para mensagem " + bundle + ":" + key + ". Esperado " + expectedArgumentCount
                    + " encontrado " + arguments.length);
        }
    }
}
